from flask import Flask, render_template, request, jsonify
import sqlite3
import re
import random
import datetime

app = Flask(__name__)

# 初始化数据库
def init_db():
    conn = sqlite3.connect('chatbot.db')
    cursor = conn.cursor()
    
    # 创建对话历史表
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS conversation_history (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            user_input TEXT,
            bot_response TEXT,
            timestamp TEXT
        )
    ''')
    
    # 创建知识库表
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS knowledge_base (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            keyword TEXT,
            response TEXT,
            category TEXT
        )
    ''')
    
    # 插入一些基础的问答对
    basic_knowledge = [
        ('你好', '你好！很高兴见到你！有什么我可以帮助你的吗？', 'greeting'),
        ('嗨', '嗨！你好啊！', 'greeting'),
        ('你是谁', '我是一个简单的聊天机器人，我可以回答一些基本问题。', 'identity'),
        ('你叫什么名字', '我叫智能聊天助手，你可以叫我小智。', 'identity'),
        ('你能做什么', '我可以回答简单问题，和你聊天，还能提供一些基本信息。', 'ability'),
        ('你好吗', '我很好，谢谢你的关心！你呢？', 'greeting'),
        ('再见', '再见！祝你有美好的一天！', 'farewell'),
        ('谢谢', '不客气！很高兴能帮到你！', 'thanks'),
        ('你多大了', '我是一个计算机程序，没有实际年龄。', 'identity'),
        ('讲个笑话', '为什么程序员总是分不清万圣节和圣诞节？因为 Oct 31 = Dec 25。', 'joke'),
        ('今天星期几', datetime.datetime.now().strftime('%Y年%m月%d日 %A'), 'date'),
        ('天气', '我现在还不能查看实时天气，但你可以告诉我你所在的城市，我会尝试为你提供一些帮助。', 'weather'),
        ('帮助', '我是一个简单的聊天机器人，可以回答一些基本问题。你可以问我：你是谁？你能做什么？今天星期几？等等。', 'help')
    ]
    
    # 检查知识库是否为空
    cursor.execute('SELECT COUNT(*) FROM knowledge_base')
    count = cursor.fetchone()[0]
    
    if count == 0:
        cursor.executemany('INSERT INTO knowledge_base (keyword, response, category) VALUES (?, ?, ?)', basic_knowledge)
    
    conn.commit()
    conn.close()

# 基于关键词匹配的问答函数
def get_response(user_input):
    user_input = user_input.lower().strip()
    
    # 连接数据库
    conn = sqlite3.connect('chatbot.db')
    cursor = conn.cursor()
    
    # 查找匹配的关键词
    cursor.execute('SELECT keyword, response FROM knowledge_base')
    knowledge = cursor.fetchall()
    
    # 模糊匹配
    matched_responses = []
    for keyword, response in knowledge:
        if re.search(rf'\b{re.escape(keyword.lower())}\b', user_input):
            matched_responses.append(response)
    
    conn.close()
    
    # 如果有匹配的回答
    if matched_responses:
        return random.choice(matched_responses)
    
    # 默认回答
    default_responses = [
        '对不起，我不太理解你的意思。',
        '这个问题有点难，我还在学习中。',
        '我不确定如何回答这个问题。',
        '能否换个方式问这个问题？',
        '我需要更多信息来回答这个问题。',
        '这个问题超出了我的知识范围。'
    ]
    
    return random.choice(default_responses)

# 保存对话历史
def save_conversation(user_input, bot_response):
    timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    
    conn = sqlite3.connect('chatbot.db')
    cursor = conn.cursor()
    cursor.execute('INSERT INTO conversation_history (user_input, bot_response, timestamp) VALUES (?, ?, ?)', 
                  (user_input, bot_response, timestamp))
    conn.commit()
    conn.close()

# 清空对话历史
def clear_history():
    conn = sqlite3.connect('chatbot.db')
    cursor = conn.cursor()
    cursor.execute('DELETE FROM conversation_history')
    conn.commit()
    conn.close()

# 主页路由
@app.route('/')
def index():
    return render_template('index.html')

# 聊天接口
@app.route('/chat', methods=['POST'])
def chat():
    user_input = request.json.get('message', '')
    
    if not user_input:
        return jsonify({'response': '请输入内容后再发送。'})
    
    # 获取机器人回复
    bot_response = get_response(user_input)
    
    # 保存对话历史
    save_conversation(user_input, bot_response)
    
    return jsonify({'response': bot_response})

# 清空历史记录接口
@app.route('/clear_history', methods=['POST'])
def clear_history_route():
    clear_history()
    return jsonify({'success': True, 'message': '对话历史已清空。'})

# 启动时初始化数据库
if __name__ == '__main__':
    init_db()
    print('智能聊天助手已启动！访问 http://localhost:5000 开始聊天。')
    app.run(debug=True)